<?php
/**
 * $Id: config.php 19 2009-06-08 08:45:14Z eyou80 $
 */

/**
 * 配置类
 *
 * @package Config
 */
class Tinyask_Config implements Iterator
{
	/**
	 * 当前配置
	 *
	 * @var array
	 */
	private $_currentConfig = array();

	public function __construct($config = array())
	{
		$this->setDefault($config);
	}

	public static function factory($config = array())
	{
		return new Tinyask_Config($config);
	}

	/**
	 * 设置默认的配置
	 *
	 * @param mixed $config
	 * @param boolean $replace
	 */
	public function setDefault($config, $replace = false)
	{
		if(is_string($config)) {
			$params = array();
			parse_str($config, $params);
		} else {
			$params = $config;
		}

		foreach($params as $name => $value) {
			if($replace || !array_key_exists($name, $this->_currentConfig)) {
				$this->_currentConfig[$name] = $value;
			}
		}
	}

	/**
	 * 重设指针
	 *
	 */
	public function rewind()
	{
		reset($this->_currentConfig);
	}

	/**
	 * 返回当前值
	 *
	 * @return mixed
	 */
	public function current()
	{
		return current($this->_currentConfig);
	}

	/**
	 * 指针后移一位
	 *
	 * @return mixed
	 */
	public function next()
	{
		return next($this->_currentConfig);
	}

	/**
	 * 获取当前指针
	 *
	 * @return mixed
	 */
	public function key()
	{
		return key($this->_currentConfig);
	}

	/**
	 * 验证当前值是否到达最后
	 *
	 * @return boolean
	 */
	public function valid()
	{
		return $this->current() !== false;
	}

	/**
	 * 魔术函数获取一个配置值
	 *
	 * @param string $name
	 * @return mixed
	 */
	public function __get($name)
	{
		return isset($this->_currentConfig[$name]) ? $this->_currentConfig[$name] : null;
	}

	/**
	 * 魔术函数设置一个配置值
	 *
	 * @param string $name
	 * @param mixed $value
	 */
	public function __set($name, $value)
	{
		$this->_currentConfg[$name] = $value;
	}

	/**
	 * 输出默认配置
	 *
	 * @param string $name
	 * @param array $args
	 */
	public function __call($name, $args)
	{
		echo $this->_currentConfig[$name];
	}

	/**
	 * 判断当前配置值是否存在
	 *
	 * @param string $name
	 * @return boolean
	 */
	public function __isset($name)
	{
		return isset($this->_currentConfig[$name]);
	}

	/**
	 * 魔术方法,打印当前配置数组
	 *
	 * @return string
	 */
	public function __toString()
	{
		return serialize($this->_currentConfig);
	}
}
